#ifndef __SONIXCAMERA_H__
#define __SONIXCAMERA_H__
	#include "util.h"




////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//	库初始化
//在调用库的接口函数之前，需要首先调用SonixCam_Init函数，只有该函数返回成功后，才可以调用其它接口函数
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/*
*	Function:		SonixCam_Init
*	Description:	库的初始化
*	Parameters:		vidpid：如果指定vidpid，则会寻找并指向设备，如果没有找到，返回FALSE。
*	Return :		成功返回	TRUE
*/
bool  SonixCam_Init(char *vidpid);

////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/*
*	Function:		SonixCam_UnInit
*	Description:		
*	Parameters:	
*	Return :		成功返回 TRUE
*/
bool  SonixCam_UnInit();


////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//	重启设备
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/*
*	Function:		SonixCam_RestartDevice
*	Description:		
*	Parameters:
*	Return :		成功返回	TRUE
*/
bool  SonixCam_RestartDevice();

////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//	获得错误代码
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/*
*	Function:		SonixCam_GetErrorCode
*	Description:
*	Parameters:
*	Return :		成功返回	TRUE
*/
ERROR_CODE SonixCam_GetErrorCode();

////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//	Dsp寄存器读
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/*
*	Function:		SonixCam_AsicRegisterRead
*	Description:
*	Parameters:		addr:dsp寄存器地址，pData读取数据缓存，len：要读取的数据字节数。
*	Return :		成功返回	TRUE
*/
bool  SonixCam_AsicRegisterRead(unsigned short addr, unsigned char pData[], long len);

////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//	Dsp寄存器写
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/*
*	Function:		SonixCam_AsicRegisterWrite
*	Description:
*	Parameters:		addr:dsp寄存器地址，pData：写数据缓存，len：要写的数据字节数。
*	Return :		成功返回	TRUE
*/
bool  SonixCam_AsicRegisterWrite(unsigned short addr, unsigned char pData[], long len);

////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//	I2C读
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/*
*	Function:		SonixCam_SensorRegisterCustomRead
*	Description:	
*	Parameters:		slaveId:I2c子设备ID，addr：要读的地址，pData：读缓存， len：读数据长度， pollSCL：SCL 拉高
*	Return :		成功返回	TRUE
*/
bool  SonixCam_SensorRegisterCustomRead(unsigned char slaveId, long  addr, unsigned char pData[], long len, bool pollSCL);//bool pollSCL = FALSE

////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//	I2C写
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/*
*	Function:		SonixCam_SensorRegisterCustomWrite
*	Description:	
*	Parameters:		slaveId:I2c子设备ID，addr：要写的地址，pData：写缓存， len：写数据长度， pollSCL：SCL 拉高
*	Return :		成功返回	TRUE
*/
bool  SonixCam_SensorRegisterCustomWrite(unsigned char slaveId, long  addr, unsigned char pData[], long len,  bool pollSCL); //bool pollSCL = FALSE

// XU read
bool SonixCam_XuRead(unsigned char pData[], unsigned int length, unsigned char unitID, unsigned char cs);
// XU write
bool SonixCam_XuWrite(unsigned char pData[], unsigned int length, unsigned char unitID, unsigned char cs);

////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//	FLASH读，如果获得的DSP_ROM_TYPE是DRT_64K，则可以读取Flash的范围是0-64K, 否则如果DSP_ROM_TYPE是DRT_128K， 读取范围是0-128K
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/*
*	Function:		SonixCam_SerialFlashRead
*	Description:	
*	Parameters:		addr：要写的地址，pData：写缓存， len：写数据长度
*	Return :		成功返回	S_OK
*/
bool  SonixCam_SerialFlashRead(long addr, unsigned char pData[], long len);

////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//	FLASH读，和SonixCam_SerialFlashRead功能相似，读取Flash的范围不受DSP_ROM_TYPE影响，速度比SonixCam_SerialFlashRead慢
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/*
*	Function:		SonixCam_SerialFlashCustomRead
*	Description:	
*	Parameters:		addr：要写的地址，pData：写缓存， len：写数据长度
*	Return :		成功返回	TRUE
*/
bool  SonixCam_SerialFlashCustomRead(long addr, unsigned char pData[], long len);

////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//	FLASH写
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/*
*	Function:		SonixCam_SerialFlashWrite
*	Description:	与SonixCam_SerialFlashSectorWrite的区别是它不擦除addr地址所在的扇区，需要确保调用该函数之前
*					已经关闭Flash的写保护并且addr地址要写的区域已经擦除。
*	Parameters:		addr：写的地址，pData：写缓存， len：写数据长度，sft: FLASH的类型
*	Return :		成功返回	TRUE
*/
bool  SonixCam_SerialFlashWrite(long addr, unsigned char pData[], long len);

////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//	FLASH写，写地址最大范围是0-256k空间，不要在开图的情况下调用该函数。
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/*
*	Function:		SonixCam_SerialFlashSectorWrite
*	Description:	先关闭FLASH的写保护，并擦除参数addr地址所在的Flash的扇区，然后写入数据。
*	Parameters:		addr：写的地址，pData：写缓存， len：写数据长度，sft: FLASH的类型
*	Return :		成功返回	TRUE
*/
bool  SonixCam_SerialFlashSectorWrite(long addr, unsigned char pData[], long len, SERIAL_FLASH_TYPE sft);

////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//	FLASH写，和SonixCam_SerialFlashWrite功能相似，写lash的范围不受DSP_ROM_TYPE影响，速度比SonixCam_SerialFlashWrite慢
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/*
*	Function:		SonixCam_SerialFlashSectorCustomWrite
*	Description:	
*	Parameters:		addr：要写的地址，pData：写缓存， len：写数据长度
*	Return :		成功返回	S_OK
*/
bool  SonixCam_SerialFlashSectorCustomWrite(long addr, unsigned char pData[], long len, SERIAL_FLASH_TYPE sft);

////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//	获得FLASH的类型
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/*
*	Function:		SonixCam_GetSerialFlashType
*	Description:
*	Parameters:		sft：成功返回flash的类型，check：设为true，在flash读取flash类型
*	Return :		成功返回	TRUE
*/
bool  SonixCam_GetSerialFlashType(SERIAL_FLASH_TYPE *sft);

////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//	获得FW Code版本号
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/*
*	Function:		SonixCam_GetFWVersion
*	Description:
*	Parameters:		pData：FW Code版本号缓存数组指针，len：缓存数组最大字节数，bNormalExport：为TRUE以默认方式排列版本号字符串，为FALSH，以第二种方式排列版本号字符串, 和原始固件名相同。
*	Return :		成功返回	TRUE
*/
bool  SonixCam_GetFwVersion(unsigned char pData[], long len, BOOL bNormalExport); //BOOL bNormalExport = TRUE

////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//	获得FW Code版本号， 如果是271设备，则需要调用该函数获得FW版本号
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/*
*	Function:		SonixCam_GetFWVersion
*	Description:
*	Parameters:		romType： DSP的ROM大小， pData：FW Code版本号缓存数组指针，len：缓存数组最大字节数，bNormalExport：为TRUE以默认方式排列版本号字符串，为FALSH，以第二种方式排列版本号字符串, 和原始固件名相同。
*	Return :		成功返回	TRUE
*/
bool  SonixCam_GetFwVersionEx(DSP_ROM_TYPE romType, unsigned char pData[], long len, BOOL bNormalExport); //BOOL bNormalExport = TRUE

////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//	获得设备Manufacturer
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/*
*	Function:		SonixCam_GetManufacturer
*	Description:
*	Parameters:		pData：Manufacturer缓存数组指针，len：缓存数组最大字节数
*	Return :		成功返回	TRUE
*/
bool  SonixCam_GetManufacturer(unsigned char pData[], long len);

////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//	获得设备Product
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/*
*	Function:		SonixCam_GetProduct
*	Description:
*	Parameters:		pData：Product缓存数组指针，len：缓存数组最大字节数
*	Return :		成功返回	TRUE
*/
bool  SonixCam_GetProduct(unsigned char pData[], long len);

////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//	获得设备vidpid
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/*
*	Function:		SonixCam_GetVidPid
*	Description:
*	Parameters:		pData：vidpid缓存数组指针，len：缓存数组最大字节数
*	Return :		成功返回	TRUE
*/
bool  SonixCam_GetVidPid(unsigned char pData[], long len);

////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//	获得设备String3
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/*
*	Function:		SonixCam_GetString3
*	Description:
*	Parameters:		pData：String3缓存数组指针，len：缓存数组最大字节数
*	Return :		成功返回	TRUE
*/
bool SonixCam_GetString3(unsigned char pData[], long len);

////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//	获得设备Interface
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/*
*	Function:		SonixCam_GetInterface
*	Description:
*	Parameters:		pData：Interface缓存数组指针，len：缓存数组最大字节数
*	Return :		成功返回	TRUE
*/
bool SonixCam_GetInterface(unsigned char pData[], long len);

////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//	获得设备序列号
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/*
*	Function:		SonixCam_GetSerialNumber
*	Description:
*	Parameters:		pData：序列号缓存数组指针，len：缓存数组最大字节数
*	Return :		成功返回	TRUE
*/
bool  SonixCam_GetSerialNumber(unsigned char pData[], long len);

////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//	进度回调函数指针
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/*
*	Description:	SonixCam_BurnerFW， SonixCam_WriteFwToFlash， SonixCam_ExportFW，SonixCam_FullCheckFW， SonixCam_CustomBurnerFW，
*					SonixCam_SetParamTableFromFWFile中可以传递函数指针来更新烧录进度
*	Parameters:		ptrClass：类指针，fProcess：当前进度值
*	Return :		成功返回	TRUE
*/
typedef void(*SonixCam_SetProgress)(void *ptrClass, float fProcess);


////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//	关闭FLASH的写保护
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/*
*	Function:		SonixCam_DisableSerialFlashWriteProtect
*	Description:
*	Parameters:		sft：FLASH类型
*	Return :		成功返回	TRUE
*/
bool SonixCam_DisableSerialFlashWriteProtect(SERIAL_FLASH_TYPE sft);

////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//	擦除FLASH
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/*
*	Function:		SonixCam_EraseSerialFlash
*	Description:
*	Parameters:		sft： FLASH类型
*	Return :		成功返回	TRUE
*/
bool SonixCam_EraseSerialFlash(SERIAL_FLASH_TYPE sft);

////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//	擦除FLASH的一个扇区
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/*
*	Function:	SonixCam_EraseSectorFlash
*	Description:
*	Parameters:	addr：要擦除的扇区地址，sft：FLASH类型
*	Return :	成功返回	TRUE
*/
bool SonixCam_EraseSectorFlash(long addr, SERIAL_FLASH_TYPE sft);

////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//	擦除FLASH的一个块区
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/*
*	Function:	SonixCam_EraseBlockFlash
*	Description:
*	Parameters:	addr：要擦除的块区地址，sft：FLASH类型
*	Return :	成功返回	TRUE
*/
bool SonixCam_EraseBlockFlash(long addr, SERIAL_FLASH_TYPE sft);

////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//	获得rom类型
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/*
*	Function:	SonixCam_GetAsicRomType
*	Description:	
*	Parameters:	romType：返回rom类型，chipID：当前dsp的芯片id值
*	Return :	成功返回	TRUE
*/
bool SonixCam_GetAsicRomType(DSP_ROM_TYPE *romType);

////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//	烧录固件，不要在开图的情况下调用该函数。
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/*
*	Function:	SonixCam_BurnerFW
*	Description: 首先会关闭Flash的写保护，然后擦除整个Flash区域，然后将固件写入到Flash
*	Parameters:	pFwBuffer：要烧录的固件缓存指针，lFwLength：固件缓存长度， setProgress：烧录进度回调函数指针， ptrClass：当前类， sft：flash类型， bFullCheckFW：烧录完成后是否进行全校验
*	Return :	成功返回	TRUE
*/
bool  SonixCam_BurnerFW(unsigned char pFwBuffer[], LONG lFwLength, SonixCam_SetProgress setProgress, void *ptrClass, SERIAL_FLASH_TYPE sft, BOOL bFullCheckFW);

////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//	烧录固件，不要在开图的情况下调用该函数。
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/*
*	Function:	SonixCam_WriteFwToFlash
*	Description: 该函数与SonixCam_BurnerFW的区别是它不会调用关闭写保护和擦除Flash，需要在调用该函数之前自己关闭Flash写保护和擦除Flash相应区域
*	Parameters:	pFwBuffer：要烧录的固件缓存指针，lFwLength：固件缓存长度， setProgress：烧录进度回调函数指针， ptrClass：当前类， bFullCheckFW：烧录完成后是否进行全校验
*	Return :	成功返回	TRUE
*/
bool  SonixCam_WriteFwToFlash(unsigned char pFwBuffer[], LONG lFwLength, SonixCam_SetProgress setProgress, void *ptrClass, BOOL bFullCheckFW); //BOOL bFullCheckFW = FALSE

////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//	导出固件
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/*
*	Function:	SonixCam_ExportFW
*	Description:
*	Parameters:	pFwBuffer：要保存固件缓存指针，lFwLength：固件缓存长度， setProgress：导出进度回调函数指针， ptrClass：当前类
*	Return :	成功返回	TRUE
*/
bool  SonixCam_ExportFW(unsigned char  pFwBuffer[], LONG lFwLength, SonixCam_SetProgress setProgress, void *ptrClass);

//extend burner fw
typedef struct
{
	unsigned int SerialNumberLength;
	unsigned int ProductLength;
	unsigned int ManufactureLength;
	unsigned int VidPidLength;
	unsigned int InterfaceLength;
	unsigned int String3Length;
	char* pSerialNumber;
	char* pProduct;
	char* pManufacture;
	char* pVidPid;
	char* pString3;
	char* pInterface;
}ChangeParamInfo;


////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//	自定义烧录固件，不要在开图的情况下调用该函数。
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/*
*	Function:	SonixCam_SetParamTableFormFWFile
*	Description:	该函数和SonixCam_BurnerFW的区别是它可以更改设备的一些参数
*	Parameters:	paramInfo：要更改的参数信息，pFwBuffer：固件缓存指针，lFwLength：缓存长度，setProgress：烧录进度回调函数指针， ptrClass：当前类， sft:FLASH类型，bFullCheckFW：是否烧录完成后进行全校验
*	Return :	成功返回	TRUE
*/
bool SonixCam_CustomBurnerFW(const ChangeParamInfo paramInfo, unsigned char pFwBuffer[], LONG lFwLength, SonixCam_SetProgress setProgress, void *ptrClass, SERIAL_FLASH_TYPE sft, BOOL bFullCheckFW);


////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//	修改设备参数表信息，不要在开图的情况下调用该函数。
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/*
*	Function:	SonixCam_SetParamTableFromFWFile
*	Description:	该函数和SonixCam_BurnerFW的区别是它不需要把整个FW烧录到Flash，只需要烧录参数表所在的扇区数据，pFW固件缓存内容必须和设备FLASH中的固件相同
*	Parameters:	pFW：固件缓存指针，lFwLength：缓存长度，setProgress：烧录进度回调函数指针， ptrClass：当前类， sft:FLASH类型，pLogFilePath: 打印的Log文件路径，可以为空，则不打印Log信息， bFullCheckFW：是否烧录完成后进行全校验
*	Return :		成功返回S_OK
*/
bool SonixCam_SetParamTableFormFWFile(unsigned char pFW[], long lFwLength, const ChangeParamInfo *pParamInfo, SonixCam_SetProgress setProgress, void *ptrClass, SERIAL_FLASH_TYPE sft, char* pLogFilePath);
unsigned int SonixCamera_num();
void SonixCamera_SetDevicesID(unsigned int ID);
#endif
